package com.代理模式.JDK动态代理;

import org.apache.poi.ss.formula.functions.T;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 工厂类：获取代理对象
 */
public class ProxyFactory {

    /**
     * 声明目标对象
     */
    private Trainstation trainstation=new Trainstation();
    /**
     * 获取代理对象
     * ----------------------
     * newProxyInstance（）方法的三个参数
     * ClassLoader loader：类加载器，用于加载代理类，可以通过目标对象来获取类加载器
     * Class<?>[] interfaces：代理类实现的接口的字节码对象
     * InvocationHandler h ：代理对象的调用处理程序
     */
    public SellTickets getProxyObject(){
        SellTickets proxyObject=(SellTickets) Proxy.newProxyInstance(
                trainstation.getClass().getClassLoader(),
                trainstation.getClass().getInterfaces(),
                new InvocationHandler() {
                    /**
                     *
                     * 参数1：proxy是代理对象，和上面的proxyObject是同一个对象
                     * 参数2：method：表示对接口中的方法进行分装的Method对象
                     * 参数3：args：调用目标方法的实际参数
                     * Object返回值：返回值就是目标方法的返回值
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("前置方法增强>>>>>>代售点收取费用");
                        //执行目标对象的方法
                        Object returnObj = method.invoke(trainstation, args);
                        System.out.println("后置方法增强>>>>>>给用户发短信");
                        return returnObj;
                    }
                }
        );
        return proxyObject;
    }
}
